/*
 * Encabezado.cpp
 *
 *  Created on: 14/01/2010
 *      Author: San Martín, Matías I.
 */

#include "Encabezado.h"

#include <iostream>

#include "../../../Framework/Common/File.h"


namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const Encabezado &obj )
{
  return stream << "Encabezado("<< obj.getTamanio() <<"):"
			  << obj._data.destino.contenedor << ";" << obj._data.destino.contenido
			  << "|"
			  << obj._data.origen.contenedor << ";" << obj._data.origen.contenido
			  << "|"
			  << obj._data.tipo;
}

Encabezado::Encabezado() {
	this->setTamanio(sizeof(t_encabezado));
}

Encabezado::~Encabezado() {
}

void Encabezado::setOrigen(const IdPlaneta& origen)
{
	origen.saveToMensaje(_data.origen);
}

void Encabezado::setOrigen(const IdJugador& origen)
{
	origen.saveToMensaje(_data.origen);
}

void Encabezado::setOrigenDirectorio()
{
	_data.origen.contenedor = 0;
	_data.origen.contenido = -1;
}

void Encabezado::setDestino(const IdPlaneta& destino)
{
	destino.saveToMensaje(_data.destino);
}

void Encabezado::setDestino(const IdJuego& destino)
{
	destino.saveToMensaje(_data.destino);
}

void Encabezado::setDestino(const IdJugador& destino)
{
	destino.saveToMensaje(_data.destino);
}

void Encabezado::getOrigen( IdPlaneta& origen)
{
	origen.loadFromMensaje(_data.origen);
}
void Encabezado::getOrigen( IdJugador& origen)
{
	origen.loadFromMensaje(_data.origen);
}

void Encabezado::getDestino( IdPlaneta& destino)
{
	destino.loadFromMensaje(_data.destino);
}
void Encabezado::getDestino( IdJuego& destino)
{
	destino.loadFromMensaje(_data.destino);
}

const t_identificadorFuente& Encabezado::getOrigen()
{
	return _data.origen;
}

t_tipoMensaje Encabezado::getTipoMensaje()
{
	return _data.tipo;
}

void Encabezado::setTipo(const t_tipoMensaje& tipo)
{
	_data.tipo = tipo;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t Encabezado::save (int fd) const
{
	size_t retCantidad = this->getTamanio();
	File::writeAll(fd,&_data,retCantidad);
	return retCantidad;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
 size_t Encabezado::load (int fd)
 {
	 size_t retCantidad = this->getTamanio(); //el encabezado tiene tamaño fijo
	 File::readAll(fd,&_data,retCantidad);
	 return retCantidad;
 }

 size_t Encabezado::saveToArray (uint8_t* arr) const
 {
	memcpy(arr, &_data, this->getTamanio());
 	return this->getTamanio();
 }

  size_t Encabezado::loadFromArray (const uint8_t* arr)
  {
 	 memcpy(&_data, arr, this->getTamanio());
 	 return this->getTamanio();
  }

 } // namespace aplicacion
